#include <stdio.h>
#include <stdlib.h>

typedef struct NODE
{
	struct NODE * next;
	char key[41];
	int m;//重复的次数
} Node;

int ELFhash(Node * node,int n)
{
	unsigned long h=0;
	unsigned long g=0;
	char *key=node->key;
	while(*key) 
	{ 
		h=(h<<4)+*key++; 
		g=h&0Xf0000000L; 
		if(g) 
			h^=g>>24; 
		h&=~g; 
	} 
	return h%n; 
}//FLFhash函数，适合字符串的hash运算，这里参考了相关网站的内容。

void Insert(Node * tree, Node * node,int n)
{
	int k=ELFhash(node,n);//产生hash数
	if(tree[k].key[0]=='\0')//如果头节点就是空的
	{
		int i=0;
		while(node->key[i]!=0)
		{
			tree[k].key[i]=node->key[i];
			i++;
		}//把node节点值传递给头节点
		tree[k].key[i]='\0';//结束标志
		tree[k].m=0;//说明没有重复 
		tree[k].next=NULL;//下一个是空
		if(node)
			free(node);//释放创建的节点
		return;//返回
	}
	//下面是节点非空的情况
	Node *t=&tree[k];
	do
	{
		if(!comp(t->key,node->key))//对两个节点的值进行比较，如果一样
		{
			if(t->m==0)//如果一样，而且是第一次重复
				printf("%s\n",node->key);//输出
			t->m++;//重复标志＋1
			if(node)
				free(node);//释放创建的节点
			return;//返回
		}
		t=t->next;//否则，就找下一个
	}while(t);//直到下一个不存在了
	t=node;//那个下一个就是这个节点
}

Node * Init(char *key)
{
	int k=0;
	Node *	node=malloc(sizeof(Node));
	while(key[k]!=0)
	{
		node->key[k]=key[k];
		k++;
	}
	node->key[k]='\0';//结束符
	node->m=0;//重复标志置为0
	node->next=NULL;
	return node;
}

int comp(char *t1,char *t2)
{
	int k=0;
	do
	{
		if(t1[k]!=t2[k]) return 1;
		k++;
	}while(t1[k]!=0&&t2[k]!=0);		
	
	if(t1[k]==0&&t2[k]==0)
		return 0;
	return 1;
}//用于比较t1和t2是否相等，相等时返回0，否则返回1。
